package com.mccree.handler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class DiscardServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf in = (ByteBuf) msg;
//        try {
            //这个低效的循环实际上可以简化为：
         System.out.print(in.toString(io.netty.util.CharsetUtil.US_ASCII));
//            System.out.print(in.toString(Charset.forName("gbk")));

        //一个ChannelHandlerContext对象提供的各种操作，使您可以触发各种I / O的事件和操作。
        // 在这里，我们调用write(Object)以逐字书写接收到的消息。
        // 请注意，我们没有像DISCARD示例中那样释放收到的消息。
        // 这是因为Netty在将其写到网络中时会为您释放它。

        //ctx.write(Object)不会将消息写到网络上。
        // 它在内部进行缓冲，然后通过冲洗到导线上ctx.flush()。
        // 或者，您可以要求ctx.writeAndFlush(msg)简洁。
//        ctx.write(msg);
//        ctx.flush();
        ctx.writeAndFlush(msg);
//        }finally {
//            ReferenceCountUtil.release(msg);
            //或者，您可以在in.release()这里进行。
//        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //引发异常时关闭连接
        cause.printStackTrace();
        ctx.close();
    }
}
